<?php

use Illuminate\Support\Facades\Cache;

/**
 * 方便自己打结果的方法
 */
function aa($data)
{
    print_r($data);die;
}

function redis()
{
    return app("redis.connection");
}

/**
 * 获取token的用户
 */
function user()
{
    return auth('api')->user();
}

/**
 * 用户登陆后，一个特定的缓存键，因为用户账号可以在多个电脑同时登陆
 */
function cache_key($prefix = '')
{
    $userId  = user_id();
    $loginIp = get_ip_num();

    if (empty($prefix)) {
        $key = $userId . ':' . $loginIp;
    } else {
        $key = $prefix . ':' . $userId . ':' . $loginIp;
    }

    return $key;
}

/**
 * 获取登录用户的id , 返回值小于0表示没有找到token里的user
 */
function user_id()
{
    $user = user();

    return $user ? $user->id : 0;
}

/**
 * 返回登录用户选中的那个公司id
 */
function company_id()
{
    $cacheKey  = cache_key();
    $companyId = Cache::get('companyId:' . $cacheKey);
    if (empty($companyId)) {
        $companyId = \App\Models\CompanyUser::query()->where('user_id', user_id())->value('company_id');
        if ($companyId) {
            Cache::put('companyId:' . $cacheKey, $companyId);
            (new \App\Services\UserService())->setUserCompanyRoleCache(user_id(), $cacheKey);
        }
    }
    return $companyId;
}

/**
 * 返回登录用户选中的那个公司id
 */
function company_name()
{
    $cacheKey = cache_key();

    return Cache::get('companyName:' . $cacheKey) ?: '未知';
}

/**
 * 当前用户的角色
 */
function role_name()
{
    $cacheKey = cache_key();

    return Cache::get('companyRole:' . $cacheKey) ?: '未知';
}

/**
 * 是否超级管理员
 */
function is_super_admin($userId = NULL)
{
    $userId = $userId ?: user_id();

    $bool = in_array($userId, config('site')['super_ids']);

    return $bool ? 1 : 0;
}

/**
 * 是否公司管理员
 * admin_level : 0非管理员;1超管,2公司管理员,3副管理员
 */
function is_company_admin($userId = NULL)
{
    $userId = $userId ?: user_id();

    $roleId = \App\Models\CompanyUser::query()
        ->where('company_id', company_id())
        ->where('user_id', $userId)
        ->value('role_id');

    $adminLevel = \App\Models\Role::query()->where('id', $roleId)->value('admin_level');

    if ($adminLevel == 2 || $adminLevel == 3) {
        return true;
    }
    return false;
}

/**
 * 格式化文件路径，去掉可能出现的不合法字符
 */
function get_valid_path($path)
{
    if (str_contains($path, '/')) {
        $path = str_replace('/','_', $path);
    }
    if (str_contains($path, '\\')) {
        $path = str_replace('\\','_', $path);
    }
    if (str_contains($path, '*')) {
        $path = str_replace('*','_', $path);
    }
    if (str_contains($path, '?')) {
        $path = str_replace('?','_', $path);
    }
    if (str_contains($path, ':')) {
        $path = str_replace(':','_', $path);
    }
    if (str_contains($path, '>')) {
        $path = str_replace('>','_', $path);
    }
    if (str_contains($path, '<')) {
        $path = str_replace('<','_', $path);
    }
    if (str_contains($path, '|')) {
        $path = str_replace('|','_', $path);
    }
    if (str_contains($path, '#')) {
        $path = str_replace('#','井', $path);
    }

    return $path;
}


/**
 * 缓存用户权限菜单
 */
function cache_user_rule_menus($ruleMenus, $userId = null)
{
    $userId = $userId ?: user_id();

    Cache::put('user_rule_menus_' . $userId, json_encode($ruleMenus), config('site.cache_time'));
}

/**
 * 获取用户权限菜单缓存
 */
function get_user_rule_menus($userId = null)
{
    $userId = $userId ?: user_id();

    $ruleMenus = Cache::get('user_rule_menus_' . $userId);

    return json_decode($ruleMenus, true);
}

/**
 * 删除用户权限缓存
 */
function del_user_rule_menus($userId = null)
{
    $userId = $userId ?: user_id();

    Cache::delete('user_rule_menus_' . $userId);
}

/**
 * 获取上级目录为$id的结构树分类 $id为 0 时获取所有结构树分类
 */
function get_tree($array, $id = 0, $keyId = 'id', $parent = 'parent_id', $level = 0)
{
    if ($level > 5000) {
        return [];
    }
    $level = ++$level;
    $tree  = [];
    foreach ($array as $value) {
        //如果parent_id是 1，2，3这种的就分割开 //如果当前被循环的元素的parent_id是传入的id，就说明当前被循环元素可能有子级
        if (in_array($id, explode(',', $value[$parent]))) {
            $value['children'] = get_tree($array, $value[$keyId], $keyId, $parent, $level);
            if (!$value['children']) { //当前元素下如果没有children,就把这个下标去掉。
                unset($value['children']);
            }
            $tree[] = $value;
        }
    }
    return $tree;
}

/**
 * 判断是否手机号
 */
function is_phone_number($phone = 0)
{
    return preg_match("/^1[3456789]\d{9}$/", $phone);
}

function is_mobile_phone ($mobile_phone)
{

    $chars = "/^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$|17[0-9]{1}[0-9]{8}$/";
    if(preg_match($chars, $mobile_phone))
    {
        return true;
    }

    return false;
}

/**
 * 格式化起止日期
 */
function format_date($startDate, $endDate)
{
    $startEndDate = '';
    if (!empty($startDate) && !empty($endDate)) {
        if (str_contains($startDate, '.')) {
            $startEndDate = $startDate . '～' . $endDate; //兰渝格式 2009.04～2013.03
        } else {
            $len1      = strlen($startDate);
            $len2      = strlen($endDate);
            $startDate = ($len1 == 6) ? $startDate : date('Ym', strtotime($startDate));
            $endDate   = ($len2 == 6) ? $endDate : date('Ym', strtotime($endDate));

            $startEndDate = $startDate . '-' . $endDate;
        }
    }
    return $startEndDate;
}


/**
 * 格式化档案号
 * 因为实际档案号不够标准。有的是 '·' ，有的是 '•'，还有的是 '.'  —
 * 统一改为  '•'
 */
function format_archives_no($archivesNo)
{
    $archivesNo = trim($archivesNo);  //去掉两端空格
    if (str_contains($archivesNo, '·')) {
        $archivesNo = str_replace('·', '•', $archivesNo); //替换掉
    }
    if (str_contains($archivesNo, '▪')) {
        $archivesNo = str_replace('▪', '•', $archivesNo); //替换掉
    }
    if (str_contains($archivesNo, '・')) {
        $archivesNo = str_replace('・', '•', $archivesNo); //替换掉
    }
    if (str_contains($archivesNo, '—')) {
        $archivesNo = str_replace('—', '-', $archivesNo); //替换掉
    }

    return $archivesNo;
}

/**
 * 格式化档案号
 * 因为实际档案号不够标准。有的是 '·' ，有的是 '•'，还有的是 '.'
 * 统一改为  '•'
 */
function format_archives_no_d($archivesNo)
{
    $archivesNo = trim($archivesNo);  //去掉两端空格

    if (str_contains($archivesNo, '▪')) {
        $archivesNo = str_replace('▪', '・', $archivesNo); //替换掉
    }
    if (str_contains($archivesNo, '•')) {
        $archivesNo = str_replace('•', '・', $archivesNo); //替换掉
    }

    return $archivesNo;
}

/**
 * 有时候需要把档案号作为PDF文件名，但是呢档案号有时候会包含斜杆，这就要求把斜杠替换为双横杠 '--'
 * 例如：'J·LNGS▪5ZH-172（196）-3'; 有可能是下方的档案号变化的
 * 变为：'J·LNGS▪5ZH/172（196）-3';
 */
function transform_slash($archivesNo)
{
    $archivesNo = format_archives_no($archivesNo);
    $pos         = strrpos($archivesNo, '-'); //查找字符串中最后一次出现的位置
    $ext         = substr($archivesNo, $pos); // -3
    $archivesNo = substr($archivesNo, 0, $pos); //J•LNGS•5ZH-172（196）
    $archivesNo = str_replace('-', '/', $archivesNo); //J•LNGS•5ZH/172（196）

    return $archivesNo . $ext; //J•LNGS•5ZH-172（196）-3
}

/**
 * 获取档案号的后缀数字
 */
function get_archives_serial_no($archivesNo)
{
    $endPos = strrpos($archivesNo, '-');

    return (int)substr($archivesNo, $endPos + 1);
}

/**
 * 格式化页码
 */
function format_page_num($pageMum)
{
    if (!is_numeric($pageMum)) {
        if (strpos($pageMum, '-')) {
            $pageMum = str_replace('-', '～', $pageMum); //替换掉
        }
        if (strpos($pageMum, '~')) {
            $pageMum = str_replace('~', '～', $pageMum); //替换掉
        }
    }

    return $pageMum ?: '';
}


/**
 * 把非数字变为 0
 */
function to_int($value)
{
    if (empty($value) || !is_numeric($value)) {
        return 0;
    }
    return (int)$value;
}

/**
 * 转数组
 */
function to_array($value, $separator = ',')
{
    if (is_array($value)) {
        $res = $value;
    } elseif (is_numeric($value)) {
        $res = [$value];
    } elseif (is_string($value)) {
        $arr = explode($separator, $value);
        $res = array_unique(array_filter($arr)); //去掉空值，保证唯一
    } else {
        $res = [];
    }
    return $res;
}

/**
 * 获取IP地址转化为数字
 */
function get_ip_num()
{
    return str_replace('.', '', request()->ip());
}

/**
 * 获取随机字符串，可作为 redis key的一部分，保证键值唯一
 *
 * @param string $prefix
 * @return string
 * @author: lxk
 * @date: 2024-10-24 14:06
 */
function get_rand_str(string $prefix = '') : string
{
    $random = \Illuminate\Support\Str::random(32);

    return $prefix . ':' . $random;
}

/**
 * 获取当前用户特有的一个值
 *
 * @param string $prefix
 * @return string
 * @author: lxk
 * @date: 2024/3/20 10:27
 */
function get_user_key(string $prefix = '') : string
{
    return $prefix . ':' . get_ip_num().':'. user_id();
}

/**
 * 去掉字符串【两端空格】，和换行符，中间空格保留
 *
 * @param $str
 * @return string
 * @author: lxk
 * @date: 2024/3/20 10:28
 */
function format_str($str) : string
{
    if (empty($str)) return '';

    $str = str_replace(PHP_EOL, '', $str);
    $str = str_replace("&quot;", '', $str);
    $str = str_replace("/\r\n/", '', $str);
    $str = str_replace("\n", "", $str);
    $str = str_replace("\r", "", $str);
    $str = str_replace("=", '', $str);
    $str = htmlspecialchars($str);

    return trim($str) ?: '';
}

/**
 * 去掉字符串中 【全部空格】
 *
 * @param $str
 * @return string
 * @author: lxk
 * @date: 2024/4/19 15:32
 */
function format_table_label($str) : string
{
    if (empty($str)) return '';

    $str = str_replace(PHP_EOL, '', $str);
    $str = str_replace("&quot;", '', $str);
    $str = str_replace("/\r\n/", '', $str);
    $str = str_replace("\n", "", $str);
    $str = str_replace("\r", "", $str);
    $str = str_replace("=", '', $str);
    $str = str_replace(" ", '', $str); //去掉字符串中 【全部空格】
    $str = htmlspecialchars($str);

    return trim($str) ?: '';
}

/**
 * 截取指定长度的字符串(UTF-8专用 汉字和大写字母长度算1，其它字符长度算0.5)
 * 视觉上看起来一样长，更美观
 */
function cut_str_same_long($sourceStr, $cutLength)
{
    $returnStr  = '';
    $i          = 0;
    $n          = 0.0;
    $str_length = strlen($sourceStr); //字符串的字节数
    while (($n < $cutLength) and ($i < $str_length)) {
        $temp_str = substr($sourceStr, $i, 1);
        $ascNum   = ord($temp_str); //得到字符串中第$i位字符的ASCII码
        if ($ascNum >= 252) //如果ASCII位高与252
        {
            $returnStr = $returnStr . substr($sourceStr, $i, 6); //根据UTF-8编码规范，将6个连续的字符计为单个字符
            $i         = $i + 6; //实际Byte计为6
            $n++; //字串长度计1
        } elseif ($ascNum >= 248) //如果ASCII位高与248
        {
            $returnStr = $returnStr . substr($sourceStr, $i, 5); //根据UTF-8编码规范，将5个连续的字符计为单个字符
            $i         = $i + 5; //实际Byte计为5
            $n++; //字串长度计1
        } elseif ($ascNum >= 240) //如果ASCII位高与240
        {
            $returnStr = $returnStr . substr($sourceStr, $i, 4); //根据UTF-8编码规范，将4个连续的字符计为单个字符
            $i         = $i + 4; //实际Byte计为4
            $n++; //字串长度计1
        } elseif ($ascNum >= 224) //如果ASCII位高与224
        {
            $returnStr = $returnStr . substr($sourceStr, $i, 3); //根据UTF-8编码规范，将3个连续的字符计为单个字符
            $i         = $i + 3; //实际Byte计为3
            $n++; //字串长度计1
        } elseif ($ascNum >= 192) //如果ASCII位高与192
        {
            $returnStr = $returnStr . substr($sourceStr, $i, 2); //根据UTF-8编码规范，将2个连续的字符计为单个字符
            $i         = $i + 2; //实际Byte计为2
            $n++; //字串长度计1
        } elseif ($ascNum >= 65 and $ascNum <= 90 and $ascNum != 73) //如果是大写字母 I除外
        {
            $returnStr = $returnStr . substr($sourceStr, $i, 1);
            $i         = $i + 1; //实际的Byte数仍计1个
            $n++; //但考虑整体美观，大写字母计成一个高位字符
        } elseif (!(array_search($ascNum, array(37, 38, 64, 109, 119)) === FALSE)) //%,&,@,m,w 字符按１个字符宽
        {
            $returnStr = $returnStr . substr($sourceStr, $i, 1);
            $i         = $i + 1; //实际的Byte数仍计1个
            $n++; //但考虑整体美观，这些字条计成一个高位字符
        } else //其他情况下，包括小写字母和半角标点符号
        {
            $returnStr = $returnStr . substr($sourceStr, $i, 1);
            $i         = $i + 1; //实际的Byte数计1个
            $n         = $n + 0.5; //其余的小写字母和半角标点等与半个高位字符宽...
        }
    }
    return $returnStr;
}

/**
 * 生成一个随机字符串
 *
 * @param int $length
 * @return string
 * @author: lxk
 * @date: 2025-07-21 17:24
 */
function create_random_num_str(int $length = 6) : string
{
    $characters = '012356789acdefghijklmnopqrstuvwxyz';

    return substr(str_shuffle($characters), 0, $length);
}








